package GUI.pdaGrafica;

import javax.swing.JPanel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


import javax.swing.JWindow;
import java.awt.Dimension;
import javax.swing.JScrollPane;
import java.awt.Rectangle;
import javax.swing.JList;
import javax.swing.BorderFactory;
import javax.swing.border.BevelBorder;
import javax.swing.border.TitledBorder;
import java.awt.Font;
import java.awt.Color;
import java.awt.Point;

import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.ListSelectionModel;

import java.util.List;
import java.util.ListIterator;

import javax.swing.border.EtchedBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import modelo.gestionPedidos.Pedido;
import javax.swing.JTextArea;
/**
 * Esta clase implementa la sección para especificar las observaciones de los pedidos
 * 
 * @created 04-may-2007 17:00
 * @version 1.0
 * @author Enrique Menor Santos
 *
 */
public class EspecificarObservaciones extends JWindow implements ActionListener,ListSelectionListener, KeyListener {

	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JScrollPane jSPredefinidas = null;
	private JList jLObservacionesPredefinidas = null;
	/**
	 * El modelo de la vista anterior. Contendrá las observaciones predefinidas del Restaurante
	 */
	private DefaultListModel modeloObservaciones=null;
	
	private JButton jBAceptar = null;
	private JButton jBCancelar = null;
	private JLabel jLNuevaObservacion = null;
	private JButton jBAgregar = null;

	/**
	 * Atributo que mantiene una referencia a la ventana de Crear/Ampliar pedido que la ha invocado
	 */
	private CrearEditarConsumiciones owner;
	/**
	 * Pedido al que se le está añadiendo la consumicion.
	 * Nos  servirá para obtener las observaciones predefinidas del restaurante
	 */
	private Pedido pedido=null;
	/**
	 * Lista en la que almacenaremos el nombre de las observaciones predefinidas
	 */
	private List<String> listaObservaciones=null;
	private JScrollPane jSPNuevaObservacion = null;
	private JTextArea jTANuevaConsumicion = null;
	
	
	/**
	 * Le pasamos al constructor la ventana a la que pertenece, para volver despues a ella
	 * @param pedido 
	 * @param consumicion 
	 * @param consumicion 
	 * 
	 */
	public EspecificarObservaciones(CrearEditarConsumiciones owner, Pedido pedido)
	{
		//La siguiente instrucción es la que me permite tener un JTextArea editable dentro de un JWindow
		super(new JFrame(){public boolean isShowing(){return true;}});
		//¿?No me prengunteis por qué....¿?
		this.owner= owner;
		this.pedido=pedido;
				
		if (pedido!=null)
			this.listaObservaciones=pedido.recuperarObservaciones();
		
		initialize();
	}
	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(240, 320);
		this.setContentPane(getJContentPane());
		this.setName("especificarObservaciones");
		this.setMinimumSize(new Dimension(240, 320));
		this.setMaximumSize(new Dimension(240, 320));
		this.setPreferredSize(new Dimension(240, 320));
		this.setAlwaysOnTop(true);
		this.setFocusableWindowState(true);
	}
	/**
	 * This method initializes jContentPane	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jLNuevaObservacion = new JLabel();
			jLNuevaObservacion.setBounds(new Rectangle(9, 24, 141, 17));
			jLNuevaObservacion.setText("Nueva Observación:");
			jContentPane = new JPanel();
			jContentPane.setLayout(null);
			jContentPane.setName("panelEspecificarObservaciones");
			jContentPane.setToolTipText("Escriba la observación a añadir a la consumición");
			jContentPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), "ESPECIFICAR OBSERVACIONES", TitledBorder.CENTER, TitledBorder.ABOVE_TOP, new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));
			jContentPane.add(getJSPredefinidas(), null);
			jContentPane.add(getJBAceptar(), null);
			jContentPane.add(getJBCancelar(), null);
			jContentPane.add(jLNuevaObservacion, null);
			jContentPane.add(getJBAgregar(), null);
			jContentPane.add(getJSPNuevaObservacion(), null);
		}
		return jContentPane;
	}

	/**
	 * This method initializes jSPredefinidas	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getJSPredefinidas() {
		if (jSPredefinidas == null) {
			jSPredefinidas = new JScrollPane();
			jSPredefinidas.setBorder(BorderFactory.createTitledBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED), "Observaciones Predefinidas:", TitledBorder.LEFT, TitledBorder.ABOVE_TOP, new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));
			jSPredefinidas.setSize(new Dimension(231, 155));
			jSPredefinidas.setLocation(new Point(5, 123));
			jSPredefinidas.setViewportView(getJLObservacionesPredefinidas());
			jSPredefinidas.setToolTipText("Mesas disponibles en el momento actual");
		}
		return jSPredefinidas;
	}

	/**
	 * This method initializes jLObservacionesPredefinidas	
	 * 	
	 * @return javax.swing.JList	
	 */
	private JList getJLObservacionesPredefinidas() {
		if (jLObservacionesPredefinidas == null) {
			creaModeloObservaciones();
			jLObservacionesPredefinidas = new JList();
			jLObservacionesPredefinidas.setModel(this.modeloObservaciones);
			jLObservacionesPredefinidas.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
			jLObservacionesPredefinidas.addListSelectionListener(this);
		}
		return jLObservacionesPredefinidas;
	}
	/**
	 * Método interno que crea el modelo de las observaciones
	 *
	 */
	private void creaModeloObservaciones() 
	{
		this.modeloObservaciones = new DefaultListModel();
		
		if (this.listaObservaciones!=null)
		{
			ListIterator<String> it = listaObservaciones.listIterator();
			while(it.hasNext())
				modeloObservaciones.addElement(it.next());
		}		
	}
	/**
	 * This method initializes jBAceptar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJBAceptar() {
		if (jBAceptar == null) {
			jBAceptar = new JButton();
			jBAceptar.setLocation(new Point(6, 280));
			jBAceptar.setEnabled(false);
			jBAceptar.setToolTipText("Se creará un nuevo pedido en el sistema");
			jBAceptar.setMnemonic(KeyEvent.VK_ACCEPT);
			jBAceptar.setIcon(new ImageIcon(getClass().getResource("/iconos/accept.png")));
			jBAceptar.setText("Añadir");
			jBAceptar.setSize(new Dimension(110, 30));
			jBAceptar.addActionListener(this);
		}
		return jBAceptar;
	}

	/**
	 * This method initializes jBCancelar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJBCancelar() {
		if (jBCancelar == null) {
			jBCancelar = new JButton();
			jBCancelar.setLocation(new Point(124, 280));
			jBCancelar.setMnemonic(KeyEvent.VK_CANCEL);
			jBCancelar.setIcon(new ImageIcon(getClass().getResource("/iconos/cancel.png")));
			jBCancelar.setText("Cancelar");
			jBCancelar.setSize(new Dimension(110, 30));
			jBCancelar.addActionListener(this);
		}
		return jBCancelar;
	}

	/**
	 * This method initializes jBAgregar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJBAgregar() {
		if (jBAgregar == null) {
			jBAgregar = new JButton();
			jBAgregar.setIcon(new ImageIcon(getClass().getResource("/iconos/table_edit.png")));
			jBAgregar.setMnemonic(KeyEvent.VK_A);
			jBAgregar.setName("agregar");
			jBAgregar.setText("Agregar a predefinidas");
			jBAgregar.setToolTipText("Click para agregar la nueva observación a las predefinidas");
			jBAgregar.setLocation(new Point(22, 102));
			jBAgregar.setSize(new Dimension(194, 20));
			jBAgregar.setActionCommand("Agregar");
			jBAgregar.addActionListener(this);
		}
		return jBAgregar;
	}
	/**
	 * This method initializes jSPNuevaObservacion	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getJSPNuevaObservacion() {
		if (jSPNuevaObservacion == null) {
			jSPNuevaObservacion = new JScrollPane();
			jSPNuevaObservacion.setBounds(new Rectangle(5, 46, 229, 55));
			jSPNuevaObservacion.setViewportView(getJTANuevaConsumicion());
		}
		return jSPNuevaObservacion;
	}
	/**
	 * This method initializes jTANuevaConsumicion	
	 * 	
	 * @return javax.swing.JTextArea	
	 */
	private JTextArea getJTANuevaConsumicion() {
		if (jTANuevaConsumicion == null) {
			jTANuevaConsumicion = new JTextArea("escriba aquí la nueva observación");
			jTANuevaConsumicion.setWrapStyleWord(true);
			jTANuevaConsumicion.setEnabled(true);
			jTANuevaConsumicion.setEditable(true);
			jTANuevaConsumicion.requestFocus();	//pedimos el foco de teclado para el JTex
			jTANuevaConsumicion.addKeyListener(this);
						
		}
		return jTANuevaConsumicion;
	}
	/**
	 *  
	 *  Gestión de los botones
	 */
	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand().equals("Cancelar"))
		{
			this.dispose();	//esconde la ventana y se deshace de ella
			owner.setVisible(true);			
		}	
		else if(e.getActionCommand().equals("Añadir"))
		{			
			Object[] arrayObs = this.jLObservacionesPredefinidas.getSelectedValues();
			String obs="";
			
			for (int i=0;i<arrayObs.length;i++)
				obs=obs+(String)arrayObs[i]+" ";
			
			this.owner.setObservacion(obs);
			this.dispose();	//esconde la ventana y se deshace de ella
			owner.setVisible(true);			
		}	
		else if(e.getActionCommand().equals("Agregar"))
		{
			//insertamos la nueva observacion en la BD usando el objeto pedido
			this.pedido.agregarObservaciones(this.jTANuevaConsumicion.getText());
			//actualizamos el modelo
			this.listaObservaciones=pedido.recuperarObservaciones();;
			this.creaModeloObservaciones();
			this.jLObservacionesPredefinidas.setModel(this.modeloObservaciones);
		}	
	}
	/**
	 * Gestion de eventos de seleccion de lista
	 */
	public void valueChanged(ListSelectionEvent e) 
	{
		//no hay ningún elemento seleccionado
		if( this.jLObservacionesPredefinidas.isSelectionEmpty())
			this.getJBAceptar().setEnabled(false);
		//hay al menos un elemento seleccionado
		else
			this.getJBAceptar().setEnabled(true);		
		
	}
	public void keyPressed(KeyEvent e)
	{		
		//TODO Apéndice de método generado automáticamente
	}
	public void keyReleased(KeyEvent e) {
		// TODO Apéndice de método generado automáticamente
		
	}
	public void keyTyped(KeyEvent e) {
		
		System.err.println(this.jTANuevaConsumicion.getText());
		if(this.jTANuevaConsumicion.getText().equals(""))
			this.getJBAgregar().setEnabled(false);
		else
			this.getJBAgregar().setEnabled(true);
	}
}
